Ссылки по теме

*   [DeveloperWiki:Package signing](/index.php/DeveloperWiki:Package_signing "DeveloperWiki:Package signing")

**Состояние перевода:** На этой странице представлен перевод статьи [pacman/Package signing](/index.php/Pacman/Package_signing "Pacman/Package signing"). Дата последней синхронизации: 21 октября 2015‎. Вы можете [помочь](/index.php/ArchWiki_Translation_Team_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "ArchWiki Translation Team (Русский)") синхронизировать перевод, если в английской версии произошли [изменения](https://wiki.archlinux.org/index.php?title=Pacman/Package_signing&diff=0&oldid=405795).

Основная статья: [pacman (Русский)](/index.php/Pacman_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Pacman (Русский)").

Чтобы определить, является ли пакет подлинным, *pacman* использует [ключи GnuPG](http://www.gnupg.org/) в модели [сеть доверия](http://www.gnupg.org/gph/en/manual.html#AEN385) ("web of trust"). В настоящее время существует пять [ключей мастер-подписи](https://www.archlinux.org/master-keys/). По меньшей мере три из этих ключей мастер-подписи используются для подписи собственных ключей разработчика и доверенного пользователя, которые потом, в свою очередь, используются для подписи их пакетов. Пользователь также имеет уникальный ключ PGP, который генерируется, когда вы устанавливаете *pacman-key*. Так сеть доверия связывает пользовательский ключ с пятью мастер-ключами.

Примеры сетей доверия:

*   **Клиентские пакеты**: вы создали свой пакет сами и подписали его своим собственным ключом
*   **Неофициальные пакеты**: разработчик создал пакет и подписал его. Вы используете свой ключ для подписи этого ключа разработчика
*   **Официальные пакеты**: разработчик создал пакет и подписал его. Ключ разработчика был подписан мастер-ключами Arch Linux'a. Вы использовали свой ключ для подписи мастер-ключей и доверяете им поручиться за разработчика

**Примечание:** Протокол HKP использует порт 11371/tcp для связи. Чтобы получить подписанные ключи от серверов (при помощи *pacman-key*), требуется этот порт

## Contents

*   [1 Установка](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0)
    *   [1.1 Настройка pacman'a](#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0_pacman.27a)
    *   [1.2 Инициализация связки ключей](#.D0.98.D0.BD.D0.B8.D1.86.D0.B8.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F_.D1.81.D0.B2.D1.8F.D0.B7.D0.BA.D0.B8_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9)
*   [2 Управление связкой ключей](#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.81.D0.B2.D1.8F.D0.B7.D0.BA.D0.BE.D0.B9_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9)
    *   [2.1 Проверка пяти мастер-ключей](#.D0.9F.D1.80.D0.BE.D0.B2.D0.B5.D1.80.D0.BA.D0.B0_.D0.BF.D1.8F.D1.82.D0.B8_.D0.BC.D0.B0.D1.81.D1.82.D0.B5.D1.80-.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9)
    *   [2.2 Добавление ключей разработчика](#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9_.D1.80.D0.B0.D0.B7.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D1.87.D0.B8.D0.BA.D0.B0)
    *   [2.3 Добавление неофициальных ключей](#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.B5.D0.BE.D1.84.D0.B8.D1.86.D0.B8.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D1.85_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9)
    *   [2.4 Отладка при помощи gpg](#.D0.9E.D1.82.D0.BB.D0.B0.D0.B4.D0.BA.D0.B0_.D0.BF.D1.80.D0.B8_.D0.BF.D0.BE.D0.BC.D0.BE.D1.89.D0.B8_gpg)
*   [3 Решение проблем](#.D0.A0.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B1.D0.BB.D0.B5.D0.BC)
    *   [3.1 Не удается импортировать ключи](#.D0.9D.D0.B5_.D1.83.D0.B4.D0.B0.D0.B5.D1.82.D1.81.D1.8F_.D0.B8.D0.BC.D0.BF.D0.BE.D1.80.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D1.82.D1.8C_.D0.BA.D0.BB.D1.8E.D1.87.D0.B8)
    *   [3.2 Отключение проверки подписи](#.D0.9E.D1.82.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B2.D0.B5.D1.80.D0.BA.D0.B8_.D0.BF.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.B8)
    *   [3.3 Сброс всех ключей](#.D0.A1.D0.B1.D1.80.D0.BE.D1.81_.D0.B2.D1.81.D0.B5.D1.85_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9)
    *   [3.4 Удаление залежавшихся пакетов](#.D0.A3.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B7.D0.B0.D0.BB.D0.B5.D0.B6.D0.B0.D0.B2.D1.88.D0.B8.D1.85.D1.81.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
    *   [3.5 Обновление ключей через прокси](#.D0.9E.D0.B1.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.B9_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_.D0.BF.D1.80.D0.BE.D0.BA.D1.81.D0.B8)
    *   [3.6 gpg: keyserver receive failed: No dirmngr](#gpg:_keyserver_receive_failed:_No_dirmngr)
*   [4 Смотрите также](#.D0.A1.D0.BC.D0.BE.D1.82.D1.80.D0.B8.D1.82.D0.B5_.D1.82.D0.B0.D0.BA.D0.B6.D0.B5)

## Установка

### Настройка pacman'a

Опция `SigLevel` в файле `/etc/pacman.conf` определяет, сколько доверия требуется для установки пакета. Чтобы получить подробное объяснение того, что такое `SigLevel`, смотрите [страницу справочного руководства pacman.conf](https://www.archlinux.org/pacman/pacman.conf.5.html#_package_and_database_signature_checking) и комментарии в самом файле. Проверка подписи может быть установлена глобально или для каждого репозитория в отдельности. Если `SigLevel` установлен глобально в разделе `[options]`, требуя подписи всех пакетов, то пакеты, созданные вами, также будет нужно подписывать при помощи *makepkg*.

**Примечание:** Хотя все официальные пакеты теперь подписаны, на июнь 2012 подписывание баз данных - все еще в процессе. Если установлено значение `Required`, тогда также требуется установить `DatabaseOptional`

Конфигурация по умолчанию может использоваться для того, чтобы устанавливать только те пакеты, которые подписаны доверенными ключами:

 `/etc/pacman.conf`  `SigLevel = Required DatabaseOptional` 

Это следствие того, что параметр `TrustedOnly` используется в *pacman* по умолчанию, т.е. результат получится таким же, как и в этом примере:

```
SigLevel = Required DatabaseOptional TrustedOnly

```

Вышеупомянутое может быть достигнуто также на уровне репозитария, далее в файле конфигурации:

```
[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist

```

явно добавляет проверку подписи для пакетов репозитария, но не требует подписи от базы данных. Значение `Optional` выключит для данного репозитория используемое глобально значение `Required`.

**Важно:** Значение SigLevel `TrustAll` существует только для целей отладки и делает слишком легким доверие ключам, которые не были проверены. Вы должны использовать `TrustedOnly` для всех официальных репозитариев

### Инициализация связки ключей

Для установки связки ключей *pacman'*a используйте:

```
# pacman-key --init

```

Для этой инициализации требуется [энтропия](https://en.wikipedia.org/wiki/ru:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D1%8D%D0%BD%D1%82%D1%80%D0%BE%D0%BF%D0%B8%D0%B8 "wikipedia:ru:Источник энтропии"). Двигая мышью по кругу, нажимая случайные символы на клавиатуре или производя действия, связанные с диском (например, запустив в другой консоли `ls -R /`, `find / -name foo` или `dd if=/dev/sda8 of=/dev/tty7`), вы генерируете энтропию. Если ваша система не имеет достаточно энтропии, эта ступень может занять часы, а если вы активно генерируете энтропию, это будет выполнено намного быстрее.

Создаваемая случайная последовательность чисел используется для создания связки ключей (`/etc/pacman.d/gnupg`) и подписывающего ключа GPG вашей системы.

**Примечание:** Если вы запускаете `pacman-key --init` на компьютере, который не генерирует много энтропии (например, удаленный сервер), генерация ключа может занять очень много времени. Для выработки псевдоэнтропии установите на целевую машину [haveged](https://www.archlinux.org/packages/?name=haveged) или [rng-tools](https://www.archlinux.org/packages/?name=rng-tools).

Перед запуском `pacman-key --init` от имени суперпользователя [запустите](/index.php/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Запустите") службу `haveged.service`

## Управление связкой ключей

### Проверка пяти мастер-ключей

Начальная установка ключей выполняется при помощи команды `pacman-key --populate archlinux` (от имени суперпользователя).

Потратьте время на проверку [подписывающих мастер-ключей](https://www.archlinux.org/master-keys/) при запросе, поскольку они используются для совместной подписи (и, следовательно, доверия) со всеми остальными ключами разработчика.

Ключи PGP слишком велики (2048 бит или больше) для людей, чтобы работать с ними, поэтому они обычно хешируются, чтобы сделать из них шестнадцатиричный 40-значный отпечаток, который можно использовать для проверки вручную, что два ключа одинаковы. Последние восемь цифр отпечатка служат как имя для ключа, известных как "(краткое) имя или ID ключа" (последние *шестнадцать* цифр отпечатка могут быть "длинное ID имя ключа").

### Добавление ключей разработчика

Ключи официальных разработчиков и доверенных пользователей подписываются мастер-ключами, так что вам не нужно использовать *pacman-key*, чтобы подписывать их самостоятельно. Когда *pacman* встречает ключ, который он не может распознать, он предложит скачать его с сервера ключей (`keyserver`), указанного в файле `/etc/pacman.d/gnupg/gpg.conf` или в опции `--keyserver` командной строки. [Список серверов ключей](https://en.wikipedia.org/wiki/ru:%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B9 "wikipedia:ru:Сервер криптографических ключей") сопровождается Википедией.

Когда вы скачали ключ разработчика, вам не нужно будет скачивать его снова, и он может быть использован для проверки любого пакета, подписанного этим разработчиком.

**Примечание:** Пакет [archlinux-keyring](https://www.archlinux.org/packages/?name=archlinux-keyring), являющийся зависимостью для [pacman](https://www.archlinux.org/packages/?name=pacman), содержит последние ключи. Однако, ключи также могут быть обновлены вручную командой `pacman-key --refresh-keys` (от имени суперпользователя). При выполнении этой команды ваш локальный ключ будет также просмотрен удаленным сервером ключей и вы получите сообщение, что он не найден. Об этом вам не стоит переживать

### Добавление неофициальных ключей

Вы можете использовать этот способ, например, чтобы добавить свой ключ в связку ключей *pacman'*а или включить подписанный [неофициальный репозиторий](/index.php/Unofficial_user_repositories "Unofficial user repositories").

**Примечание:** Возможно, сначала вам потребуется выполнить команду `dirmngr` от имени суперпользователя, смотрите раздел [#gpg: keyserver receive failed: No dirmngr](#gpg:_keyserver_receive_failed:_No_dirmngr)

Сначала получите ID ключа (`keyid`) от собственника. Потом вам нужно добавить ключ в связку:

*   Если ключ найден на сервере ключей, импортируйте его командой:

	 `# pacman-key -r *keyid*` 

*   Если у вас есть ссылка на файл ключа, загрузите его и выполните:

	 `# pacman-key --add */путь/к/скачанному/файлу/ключа*` 

Всегда старайтесь проверить отпечаток, как бы вы делали с мастер-ключом или любым другим ключом, который собираетесь подписать:

```
# pacman-key -f *keyid*

```

Наконец, вам нужно подписать импортированный ключ на локальном уровне:

```
# pacman-key --lsign-key *keyid*

```

Теперь вы доверяете этому ключу подписывать пакеты.

### Отладка при помощи gpg

Для отладки вы можете получить доступ к связке ключей *pacman'*а напрямую при помощи *gpg*, например, так:

```
# gpg -- homedir /etc/pacman.d/gnupg --list-keys

```

## Решение проблем

**Важно:** Работа *pacman-key* зависит от [времени](/index.php/Time_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Time (Русский)"). Если системные часы неверны, вы увидите такие ошибки:
```
error: ИмяПакета: подпись от "User <email@archlinux.org>" неверна
error: не удалось совершить транзакцию (неверный или испорченный пакет (подпись PGP))
Случилась ошибка, пакет не обновлен.

```

### Не удается импортировать ключи

У этой проблемы могут быть разные причины:

*   Устаревший пакет [archlinux-keyring](https://www.archlinux.org/packages/?name=archlinux-keyring)
*   Неправильная дата
*   Ваш интернет-провайдер блокировал порт, используемый для импорта ключей PGP
*   Кэш *pacman'*a содержит копии неподписанных с предыдущей попытки пакетов

Во время синхронизации обновления вы можете застрять из-за устаревшего пакета [archlinux-keyring](https://www.archlinux.org/packages/?name=archlinux-keyring). Сначала попробуйте [обновить систему](/index.php/Pacman_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#.D0.9E.D0.B1.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2 "Pacman (Русский)"), это может помочь.

Если это не помогает, и если ваше системное время в порядке, можете попробовать переключиться на сервер ключей MIT, который предоставляет другой порт. Чтобы это сделать, отредактируйте файл `/etc/pacman.d/gnupg/gpg.conf`, заменив значение `keyserver` на следующее:

```
keyserver hkp://pgp.mit.edu:11371

```

Если не помогает и это, измените `keyserver` на kjsl, который предоставляет этот сервис через порт 80 (порт HTTP), который всегда должен оставаться разблокированным:

```
keyserver hkp://keyserver.kjsl.com:80

```

Если у вас отключен IPv6, *gpg* не сможет работать, если найдет какой-то адрес IPv6\. В этом случае используйте сервер ключей для исключительно IPv4, такой как:

```
keyserver hkp://ipv4.pool.sks-keyservers.net:11371

```

Если вы вдруг забыли выполнить `pacman-key --populate archlinux`, вы можете получить некоторые ошибки при импортировании ключей.

Если ничего из этого не помогает, возможно, ваш кеш *pacman'*a, располагающийся в каталоге `/var/cache/pacman/pkg/`, содержит неподписанные с предыдущих попыток пакеты. Очистите кеш вручную или выполните:

```
# pacman -Sc

```

что удалит все кешированные пакеты, которые не были установлены.

### Отключение проверки подписи

**Важно:** Используйте с осторожностью. Отключение подписи пакета позволит *pacman'*у устанавливать недоверенные пакеты автоматически

Если вас не заботит подпись пакетов, вы можете полностью отключить проверку подписи PGP. Отредактируйте файл `/etc/pacman.conf`, раскомментировав следующую строку в разделе `[options]`:

```
SigLevel = Never

```

Вам нужно также раскомментировать любые установки SigLevel, зависимые от репозитариев, потому что они перевешивают глобальные установки. Это приведет к отсутствию проверки подписи, как было свойственно пакману до четвертой версии. Если вы решите сделать так, вам не нужно устанавливать связку ключей при помощи *pacman-key*. Вы сможете изменить этот выбор позднее, если решите включить проверку пакетов.

### Сброс всех ключей

Если вы захотите удалить или сбросить все ключи, установленные в вашей системе, можете удалить каталог `/etc/pacman.d/gnupg` и перезапустить `pacman-key --init` и следуя процедуре, добавляющей ключи предпочтительным образом.

### Удаление залежавшихся пакетов

Если те же пакеты продолжают не работать и вы уверены, что сделали правильно все дела *pacman-key*, попробуйте удалить пакеты при помощи команды `rm /var/cache/pacman/pkg/*имя_плохого_пакета**`, чтобы они были скачаны заново.

Это может в самом деле оказаться решением, если вы получаете сообщение вида `error: linux: signature from "<Some.Person@example.com>" is invalid` или подобное при обновлении (например, вы можете не быть, наконец, жертвой атаки MITM, ваш скачанный файл просто поврежден).

### Обновление ключей через прокси

В *gnupg* есть [ошибка](https://bugs.g10code.com/gnupg/issue1786), не дающая обновлять ключи через http-прокси. Для разрешения этой проблемы вы можете сделать следующее:

1.  Измените /etc/hosts: `127.0.0.1 pool.sks-keyservers.net` 
2.  Установите туннель при помощи [socat](https://www.archlinux.org/packages/?name=socat). Запускать его необходимо от имени суперпользователя, потому что вам нужно прослушивание порта 80 TCP: `# socat TCP-LISTEN:80,reuseaddr,fork PROXY:localhost:pool.sks-keyservers.net:80,proxyport=3128` 
3.  Обновите ключи: `# pacman-key --refresh-keys` 

Верните назад прежнюю конфигурацию, когда прокси больше не будет нужно.

### gpg: keyserver receive failed: No dirmngr

Для получения дополнительной информации смотрите сообщение об ошибке [FS#42798](https://bugs.archlinux.org/task/42798).

Запустите:

```
# dirmngr < /dev/null

```

Или по другому: создайте файл `/root/.gnupg/dirmngr_ldapservers.conf` [[1]](https://bbs.archlinux.org/viewtopic.php?pid=1480388#p1480388).

## Смотрите также

*   [DeveloperWiki:Package Signing Proposal for Pacman](/index.php/DeveloperWiki:Package_Signing_Proposal_for_Pacman "DeveloperWiki:Package Signing Proposal for Pacman")
*   [Pacman Package Signing – 1: Makepkg and Repo-add](http://allanmcrae.com/2011/08/pacman-package-signing-1-makepkg-and-repo-add/)
*   [Pacman Package Signing – 2: Pacman-key](http://allanmcrae.com/2011/08/pacman-package-signing-2-pacman-key/)
*   [Pacman Package Signing – 3: Pacman](http://allanmcrae.com/2011/08/pacman-package-signing-3-pacman/)
*   [Pacman Package Signing – 4: Arch Linux](http://allanmcrae.com/2011/12/pacman-package-signing-4-arch-linux/)